﻿#region Copyright

// // The contents of this file are subject to the Mozilla Public License
// // Version 1.1 (the "License"); you may not use this file except in compliance
// // with the License. You may obtain a copy of the License at
// //   
// // http://www.mozilla.org/MPL/
// //   
// // Software distributed under the License is distributed on an "AS IS"
// // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
// // License for the specific language governing rights and limitations under 
// // the License.
// //   
// // The Initial Developer of the Original Code is Robert Smyth.
// // Portions created by Robert Smyth are Copyright (C) 2008-2013.
// //   
// // All Rights Reserved.

#endregion

using NoeticTools.NWorkflow.DotNetInterop;
using NoeticTools.NWorkflow.ProgressMonitoring;
using NoeticTools.NWorkflow.Scopes;
using NoeticTools.NWorkflow.Steps;


namespace NoeticTools.NWorkflow
{
    public interface IWorkflowRules
    {
        ProgressData Progress { get; }
        object SyncRoot { get; }
        void OnEventFired(object eventValue);
        void Validate();
        void TransitionTo(string destinationStep);
        void Stop();

        /// <summary>
        ///     Add a variable to this workflow's IoC/DI scope. This defines are variable that can be used by multiple steps in a workflow.
        /// </summary>
        void AddVariable<T>(T instance);
        string Name { get; }
    }

    public interface IWorkflowRules<TResult> : IWorkflowRules
    {
        OnBeginEndScope<TResult> OnBegin { get; }
        OnBeginEndScope<TResult> OnEnd { get; }
        void Exit(TResult result);
        void SetStepResult<TStepResult>(TStepResult result);
        void LeaveStep<TStepResult>(TStepResult result);
        IStep GetStep(string stepName, ITimer timer);
        IWorkflow<TResult> CreateWorkflow(string name);
        IWorkflow<TResult> CreateWorkflow(string name, ITimerFactory timerFactory);
    }
}